<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2023 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".

(a) The FSF's Front-Cover Text is:

A GNU Manual

(b) The FSF's Back-Cover Text is:

You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>RTL SSA Phi Nodes (GNU Compiler Collection (GCC) Internals)</title>

<meta name="description" content="RTL SSA Phi Nodes (GNU Compiler Collection (GCC) Internals)">
<meta name="keywords" content="RTL SSA Phi Nodes (GNU Compiler Collection (GCC) Internals)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="RTL-SSA.html#RTL-SSA" rel="up" title="RTL SSA">
<link href="RTL-SSA-Access-Lists.html#RTL-SSA-Access-Lists" rel="next" title="RTL SSA Access Lists">
<link href="RTL-SSA-Accesses.html#RTL-SSA-Accesses" rel="prev" title="RTL SSA Accesses">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>


</head>

<body lang="en">
<a name="RTL-SSA-Phi-Nodes"></a>
<div class="header">
<p>
Next: <a href="RTL-SSA-Access-Lists.html#RTL-SSA-Access-Lists" accesskey="n" rel="next">RTL SSA Access Lists</a>, Previous: <a href="RTL-SSA-Accesses.html#RTL-SSA-Accesses" accesskey="p" rel="prev">RTL SSA Accesses</a>, Up: <a href="RTL-SSA.html#RTL-SSA" accesskey="u" rel="up">RTL SSA</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="RTL-SSA-Phi-Nodes-1"></a>
<h4 class="subsection">14.21.6 RTL SSA Phi Nodes</h4>

<a name="index-phi-nodes_002c-RTL-SSA"></a>
<a name="index-rtl_005fssa_003a_003aphi_005finfo-1"></a>
<p>If a resource is live on entry to an extended basic block and if the
resource&rsquo;s value can come from multiple sources, the extended basic block
has a &ldquo;phi node&rdquo; that collects together these multiple sources.
The phi node conceptually has one input for each incoming edge of
the extended basic block, with the input specifying the value of
the resource on that edge.  For example, suppose a function contains
the following RTL:
</p>
<div class="smallexample">
<pre class="smallexample">;; Basic block bb3
&hellip;
(set (reg:SI R1) (const_int 0))  ;; A
(set (pc) (label_ref bb5))

;; Basic block bb4
&hellip;
(set (reg:SI R1) (const_int 1))  ;; B
;; Fall through

;; Basic block bb5
;; preds: bb3, bb4
;; live in: R1 &hellip;
(code_label bb5)
&hellip;
(set (reg:SI <var>R2</var>)
     (plus:SI (reg:SI R1) &hellip;))  ;; C
</pre></div>

<p>The value of R1 on entry to block 5 can come from either A or B.
The extended basic block that contains block 5 would therefore have a
phi node with two inputs: the first input would have the value of
R1 defined by A and the second input would have the value of
R1 defined by B.  This phi node would then provide the value of
R1 for C (assuming that R1 does not change again between
the start of block 5 and C).
</p>
<p>Since RTL is not a &ldquo;native&rdquo; SSA representation, these phi nodes
simply collect together definitions that already exist.  Each input
to a phi node for a resource <var>R</var> is itself a definition of
resource <var>R</var> (or is null if the resource is completely
undefined for a particular incoming edge).  This is in contrast
to a native SSA representation like GIMPLE, where the phi inputs
can be arbitrary expressions.  As a result, RTL SSA phi nodes
never involve &ldquo;hidden&rdquo; moves: all moves are instead explicit.
</p>
<p>Phi nodes are represented as a <code>rtl_ssa::phi_node</code>.
Each input to a phi node is represented as an <code>rtl_ssa::use_info</code>.
</p>
<hr>
<div class="header">
<p>
Next: <a href="RTL-SSA-Access-Lists.html#RTL-SSA-Access-Lists" accesskey="n" rel="next">RTL SSA Access Lists</a>, Previous: <a href="RTL-SSA-Accesses.html#RTL-SSA-Accesses" accesskey="p" rel="prev">RTL SSA Accesses</a>, Up: <a href="RTL-SSA.html#RTL-SSA" accesskey="u" rel="up">RTL SSA</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>
